home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / ole2book.zip / CHAP07.ZIP / CHAP07 / DATATRAN / DATAOBJ.H < prev    next >
C/C++ Source or Header  |  1993-04-23  |  5KB  |  157 lines

  1. /*
  2.  * DATAOBJ.H
  3.  *
  4.  * Classes that implement the Data Transfer Object.
  5.  *
  6.  * Copyright (c)1993 Microsoft Corporation, All Right Reserved
  7.  *
  8.  * Kraig Brockschmidt, Software Design Engineer
  9.  * Microsoft Systems Developer Relations
  10.  *
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14.  
  15.  
  16. #ifndef _DATAOBJ_H_
  17. #define _DATAOBJ_H_
  18.  
  19.  
  20. #include <windows.h>
  21. #include <ole2.h>
  22. #include <bookguid.h>
  23.  
  24. //Type for an object-destroyed callback
  25. typedef void (FAR PASCAL *LPFNDESTROYED)(void);
  26.  
  27.  
  28. /*
  29.  * Structure to describe a specific rendering that our user wants
  30.  * us to maintain.
  31.  */
  32.  
  33. typedef struct __far tagRENDERING
  34.     {
  35.     FORMATETC       fe;             //The format
  36.     STGMEDIUM       stm;            //The actual data
  37.     LPUNKNOWN       pUnkOrg;        //The real owner
  38.     } RENDERING, FAR * LPRENDERING;
  39.  
  40.  
  41.  
  42. /*
  43.  * The DataObject object is implemented in its own class with its own
  44.  * IUnknown to support aggregation.  It contains one CImpIDataObject
  45.  * object that we use to implement the externally exposed interfaces.
  46.  */
  47.  
  48. //DATAOBJ.CPP
  49.  
  50. class __far CDataObject : public IUnknown
  51.     {
  52.     //Make any contained interfaces your friends so they can get at you
  53.     friend class CImpIDataObject;
  54.  
  55.     protected:
  56.         ULONG               m_cRef;         //Object reference count.
  57.         LPUNKNOWN           m_punkOuter;    //Cont. Unk. for aggregation
  58.         LPFNDESTROYED       m_pfnDestroy;   //Function to call on closure.
  59.  
  60.         HWND                m_hList;        //Listbox of RENDERINGs
  61.  
  62.         //Contained interface implemetation
  63.         LPDATAOBJECT        m_pIDataObject;
  64.  
  65.     public:
  66.         CDataObject(LPUNKNOWN, LPFNDESTROYED);
  67.         ~CDataObject(void);
  68.  
  69.         BOOL FInit(void);
  70.         void Purge(void);
  71.  
  72.         //Non-delegating object IUnknown
  73.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  74.         STDMETHODIMP_(ULONG) AddRef(void);
  75.         STDMETHODIMP_(ULONG) Release(void);
  76.     };
  77.  
  78. typedef CDataObject FAR * LPCDataObject;
  79.  
  80.  
  81.  
  82. /*
  83.  * Interface implementations for the CDataObject object.
  84.  */
  85.  
  86. class __far CImpIDataObject : public IDataObject
  87.     {
  88.     private:
  89.         ULONG           m_cRef;         //Interface reference count.
  90.         LPCDataObject   m_pObj;         //Back pointer to the object.
  91.         LPUNKNOWN       m_punkOuter;    //Controlling unknown for delegation
  92.  
  93.     public:
  94.         CImpIDataObject(LPCDataObject, LPUNKNOWN);
  95.         ~CImpIDataObject(void);
  96.  
  97.         //IUnknown members that delegate to m_punkOuter.
  98.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  99.         STDMETHODIMP_(ULONG) AddRef(void);
  100.         STDMETHODIMP_(ULONG) Release(void);
  101.  
  102.         //IDataObject members
  103.         STDMETHODIMP GetData(LPFORMATETC, LPSTGMEDIUM);
  104.         STDMETHODIMP GetDataHere(LPFORMATETC, LPSTGMEDIUM);
  105.         STDMETHODIMP QueryGetData(LPFORMATETC);
  106.         STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC, LPFORMATETC);
  107.         STDMETHODIMP SetData(LPFORMATETC, STGMEDIUM FAR *, BOOL);
  108.         STDMETHODIMP EnumFormatEtc(DWORD, LPENUMFORMATETC FAR *);
  109.         STDMETHODIMP DAdvise(FORMATETC FAR *, DWORD,  LPADVISESINK, DWORD FAR *);
  110.         STDMETHODIMP DUnadvise(DWORD);
  111.         STDMETHODIMP EnumDAdvise(LPENUMSTATDATA FAR *);
  112.     };
  113.  
  114.  
  115.  
  116. /*
  117.  * IEnumFORMATETC object that is created from IDataObject::EnumFormatEtc.
  118.  * This object lives on its own, that is, QueryInterface only knowns
  119.  * IUnknown and IEnumFormatEtc, nothing more.  We still use an outer
  120.  * unknown for reference counting, because as long as this enumerator
  121.  * lives, the data object should live, thereby keeping the application up.
  122.  */
  123.  
  124. class __far CEnumFormatEtc : public IEnumFORMATETC
  125.     {
  126.     private:
  127.         ULONG           m_cRef;         //Object reference count.
  128.         LPUNKNOWN       m_punkRef;      //IUnknown for reference counting.
  129.         LPFORMATETC     m_prgfe;        //FORMATETC list.
  130.         ULONG           m_iCur;         //Current element.
  131.         ULONG           m_cItems;
  132.  
  133.     public:
  134.         CEnumFormatEtc(LPUNKNOWN);
  135.         ~CEnumFormatEtc(void);
  136.  
  137.         BOOL FInit(HWND);
  138.  
  139.         //IUnknown members that delegate to m_punkOuter.
  140.         STDMETHODIMP         QueryInterface(REFIID, LPVOID FAR *);
  141.         STDMETHODIMP_(ULONG) AddRef(void);
  142.         STDMETHODIMP_(ULONG) Release(void);
  143.  
  144.         //IEnumFORMATETC members
  145.         STDMETHODIMP Next(ULONG, LPFORMATETC, ULONG FAR *);
  146.         STDMETHODIMP Skip(ULONG);
  147.         STDMETHODIMP Reset(void);
  148.         STDMETHODIMP Clone(IEnumFORMATETC FAR * FAR *);
  149.     };
  150.  
  151.  
  152. typedef CEnumFormatEtc FAR * LPCEnumFormatEtc;
  153.  
  154.  
  155.  
  156. #endif //_DATAOBJ_H_
  157.